{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 探索数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(150, 4)\n"
     ]
    }
   ],
   "source": [
    "# 导入sklearn的包\n",
    "from sklearn import datasets\n",
    "# 导入time包，增加等待时间\n",
    "import time \n",
    "\n",
    "# 加载iris的数据\n",
    "iris = datasets.load_iris()\n",
    "# 显示iris的数据结构，共150行，4列\n",
    "# 4列的内容分别是花萼长度,花萼宽度,花瓣长度,花瓣宽度\n",
    "print(iris.data.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5.1, 3.5, 1.4, 0.2],\n",
       "       [4.9, 3. , 1.4, 0.2],\n",
       "       [4.7, 3.2, 1.3, 0.2],\n",
       "       [4.6, 3.1, 1.5, 0.2],\n",
       "       [5. , 3.6, 1.4, 0.2],\n",
       "       [5.4, 3.9, 1.7, 0.4]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 显示iris的数据结果\n",
    "# print(iris.data)\n",
    "iris.data[:6] #显示前6行数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n",
      " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2\n",
      " 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2\n",
      " 2 2]\n"
     ]
    }
   ],
   "source": [
    "# iris.target用0、1和2三个整数分别代表了花的三个品种\n",
    "# 三种花分别是山鸢尾花(Iris Setosa)，变色鸢尾花(Iris Versicolor)，维吉尼亚鸢尾花(Iris Virginica)\n",
    "print(iris.target)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 机器学习部分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "                     metric_params=None, n_jobs=None, n_neighbors=5, p=2,\n",
       "                     weights='distance')"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn import neighbors, datasets\n",
    "\n",
    "# KNN中的K值，默认值是5\n",
    "n_vecinos = 5\n",
    "# 导入花的数据\n",
    "iris = datasets.load_iris()\n",
    "# 保留花萼长度,花萼宽度,花瓣长度,花瓣宽度，给予X\n",
    "X = iris.data[:,:2]\n",
    "# 将目标属性赋予y\n",
    "y = iris.target\n",
    "#应用KNN Classifier\n",
    "clf = neighbors.KNeighborsClassifier(n_vecinos, weights='distance')\n",
    "\n",
    "# weights参数是用于预测的权重函数。可选参数如下:\n",
    "# - ‘uniform’ : 统一的权重. 在每一个邻居区域里的点的权重都是一样的。\n",
    "# - ‘distance’ : 权重点等于他们距离的倒数。使用此函数，更近的邻居对于所预测的点的影响更大。\n",
    "# - [callable] : 一个用户自定义的方法，此方法接收一个距离的数组，然后返回一个相同形状并且包含权重的数组。\n",
    "clf\n",
    "# 显示模型的一些参数，算法使用默认的 ‘auto’，停止建子树的叶子节点阈值leaf_size为默认值30，距离度量metric使用闵可夫斯基距离 “minkowski”，距离度量附属参数p=2，所以是欧氏距离；\n",
    "# 距离度量其他附属参数metric_params为无None，并行处理任务数n_jobs为1，即所有的CPU核都参与计算。权重weights选择的是distance\n",
    "# 使用X作为训练数据，y作为目标值来拟合模型。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "请分别输入花萼长度,花萼宽度，以空格分割8 2\n",
      "你输入的花萼长度是: 8\n",
      "你输入的花萼宽度是: 2\n",
      "0.9266666666666666\n"
     ]
    }
   ],
   "source": [
    "# 使用X作为训练数据，y作为目标值来拟合模型。\n",
    "clf.fit(X, y)\n",
    "# np.c_是按行连接两个矩阵，就是把两矩阵左右相加，要求行数相等，类似于pandas中的merge()。\n",
    "a, b = map(int, input(\"请分别输入花萼长度,花萼宽度，以空格分割\").split())\n",
    "print(\"你输入的花萼长度是: \"+ str(a))\n",
    "print(\"你输入的花萼宽度是: \"+ str(b))\n",
    "nuevo_dato = np.c_[a, b]\n",
    "nuevo_dato\n",
    "# 给提供的数据预测对应的标签。\n",
    "clase_predicha = clf.predict(nuevo_dato)\n",
    "# 返回给定测试数据和标签的平均准确值。\n",
    "print(clf.score(X,y))\n",
    "# 预测的准确值非常高，证明结果比较好\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 绘图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 加载包\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.colors import ListedColormap\n",
    "\n",
    "# 指定绘图颜色，颜色映射\n",
    "cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])\n",
    "cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])\n",
    "\n",
    "X = iris.data[:,:2]\n",
    "y = iris.target\n",
    "clf = neighbors.KNeighborsClassifier(n_vecinos, weights='distance')\n",
    "clf.fit(X, y)\n",
    "#nuevo_dato = np.c_[8, 4]\n",
    "#clase_predicha = clf.predict(nuevo_dato)\n",
    "\n",
    "\n",
    "h = .02  # step size in the mesh\n",
    "weights='distance'\n",
    "\n",
    "\n",
    "# 确认训练集的边界\n",
    "x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1\n",
    "y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1\n",
    "\n",
    "# 生成随机数据来做测试集，然后作预测\n",
    "xx, yy = np.meshgrid(np.arange(x_min, x_max, h),\n",
    "                         np.arange(y_min, y_max, h))\n",
    "Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])\n",
    "\n",
    "# 画出测试集数据\n",
    "Z = Z.reshape(xx.shape)\n",
    "plt.figure()\n",
    "plt.pcolormesh(xx, yy, Z, cmap=cmap_light)\n",
    "\n",
    "# 也画出所有的训练集数据\n",
    "plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold,\n",
    "                edgecolor='k', s=20)\n",
    "plt.xlim(xx.min(), xx.max())\n",
    "plt.ylim(yy.min(), yy.max())\n",
    "plt.title(\"3-Class classification (k = %i, weights = '%s')\"\n",
    "              % (n_vecinos, weights))\n",
    "\n",
    "plt.show()\n",
    "\n",
    "# 生成的图如下，大多数数据拟合不错，仅有少量的异常点不在范围内。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
